
#ifndef __M_ANCS_APP_H__
#define __M_ANCS_APP_H__

#include "m_ancs_drv.h"
#include "ble_ancs_c.h"

// 如果需要打印详细的ANCS的notification信息，则打开该宏
//#define M_ANCS_NOTIF_PRINF

// 使能相应的通道
#define M_ANCS_NOTIF_ATTR_ID_APP_IDENTIFIER_EN
#define M_ANCS_NOTIF_ATTR_ID_TITLE_EN
//#define M_ANCS_NOTIF_ATTR_ID_SUBTITLE_EN
#define M_ANCS_NOTIF_ATTR_ID_MESSAGE_EN
//#define M_ANCS_NOTIF_ATTR_ID_MESSAGE_SIZE_EN
#define M_ANCS_NOTIF_ATTR_ID_DATE_EN
//#define M_ANCS_NOTIF_ATTR_ID_POSITIVE_ACTION_LABEL_EN
//#define M_ANCS_NOTIF_ATTR_ID_NEGATIVE_ACTION_LABEL_EN

/* begin of arrt channel 以下宏，用来定义消息通道使能的个数*/
#ifdef M_ANCS_NOTIF_ATTR_ID_APP_IDENTIFIER_EN
#define M_ANCS_ATTR_ID 1
#else
#define M_ANCS_ATTR_ID 0
#endif
#ifdef M_ANCS_NOTIF_ATTR_ID_TITLE_EN
#define M_ANCS_ATTR_TITLE 1
#else
#define M_ANCS_ATTR_TITLE 0
#endif
#ifdef M_ANCS_NOTIF_ATTR_ID_SUBTITLE_EN
#define M_ANCS_ATTR_SUBTITLE 1
#else
#define M_ANCS_ATTR_SUBTITLE 0
#endif
#ifdef M_ANCS_NOTIF_ATTR_ID_MESSAGE_EN
#define M_ANCS_ATTR_MESSAGE 1
#else
#define M_ANCS_ATTR_MESSAGE 0
#endif
#ifdef M_ANCS_NOTIF_ATTR_ID_MESSAGE_SIZE_EN
#define M_ANCS_ATTR_MESSAGE_SIZE 1
#else
#define M_ANCS_ATTR_MESSAGE_SIZE 0
#endif
#ifdef M_ANCS_NOTIF_ATTR_ID_DATE_EN
#define M_ANCS_ATTR_DATE 1
#else
#define M_ANCS_ATTR_DATE 0
#endif
#ifdef M_ANCS_NOTIF_ATTR_ID_POSITIVE_ACTION_LABEL_EN
#define M_ANCS_ATTR_POS_ACTION 1
#else
#define M_ANCS_ATTR_POS_ACTION 0
#endif
#ifdef M_ANCS_NOTIF_ATTR_ID_NEGATIVE_ACTION_LABEL_EN
#define M_ANCS_ATTR_NEG_ACTION 1
#else
#define M_ANCS_ATTR_NEG_ACTION 0
#endif
/* end of arrt channel */

// 所有使能的ANCS通道个数的总和，用于判断ANCS的消息是否接收完毕
#define M_ANCS_NOTIF_ATTR_ID_TOTAL                                                                                                                                                                     \
    M_ANCS_ATTR_ID + M_ANCS_ATTR_TITLE + M_ANCS_ATTR_SUBTITLE + M_ANCS_ATTR_MESSAGE + M_ANCS_ATTR_MESSAGE_SIZE + M_ANCS_ATTR_DATE + M_ANCS_ATTR_POS_ACTION + M_ANCS_ATTR_NEG_ACTION

// 总共有4种需要处理的消息种类（其中最后两个，同为QQ信息）
static const char *lit_attrid_type[] = {
    "com.apple.mobilephone",  "com.apple.MobileSMS",  "com.tencent.xin",
    "com.tencent.mipadqq",    // iPad的QQ消息ID
    "com.tencent.mqq",        // iPhone的QQ消息ID
    "com.facebook.Facebook",  // Facebook的消息ID
    "com.facebook.Messenger", // Messenger接管Facebook的消息ID
    "net.whatsapp.WhatsApp",  "com.atebits.Tweetie2", "com.skype.tomskype", "jp.naver.line", "com.linkedin", "com.burbn.instagram", "com.tencent.tim", "com.toyopagroup",
};

// 我们所关心的消息种类
typedef enum
{
    ATTR_ID_CALL,
    ATTR_ID_SMS,
    ATTR_ID_WECHAT,
    ATTR_ID_QQ_IPAD,
    ATTR_ID_QQ_IPHONE,
    ATTP_ID_FACEBOOK,
    ATTP_ID_MESSENGER,
    ATTP_ID_WHATSAPP,
    ATTP_ID_TWITTER,
    ATTP_ID_SKYPE,
    ATTP_ID_LINE,
    ATTP_ID_LINKEDLN,
    ATTP_ID_INSTAGRAM,
    ATTP_ID_QQ_TIM,
    ATTP_ID_SNAPCHAT,
    ATTP_ID_OTHERS,
    ATTR_ID_HANG_UP,
    ATTR_ID_RESERVE
} attr_id_type_t;

// 设备类型：0 - 安卓，1 - 苹果
typedef enum
{
    APP_TYPE_ANDROID,
    APP_TYPE_APPLE
} app_type_t;

// 消息存储的结构体
typedef struct
{
    uint8_t appAttrTitle[BLE_ANCS_ATTR_DATA_MAX + 1];       // 消息的标题
    uint8_t appAttrMessage[BLE_ANCS_ATTR_DATA_MAX * 2 + 1]; //消息内容

    app_type_t appType; // 0 - 安卓， 1 - 苹果
#ifdef ANCS_ADD_TIME
    uint32_t time;
#endif //!< #ifdef ANCS_ADD_TIME
} m_ancs_app_attr_info_t;

// app推送的消息类型
typedef enum
{
    M_MESSAGE_CALL_OFF = 0x00,
    M_MESSAGE_CALLING = 0x01,
    M_MESSAGE_SMS = 0x02,
    M_MESSAGE_QQ = 0x04,
    M_MESSAGE_WECHAT = 0x08,
    M_MESSAGE_FACEBOOK = 0x10,
    M_MESSAGE_WHATSAPP = 0x20,
    M_MESSAGE_TWITTER = 0x40,
    M_MESSAGE_SKYPE = 0x80,
    M_MESSAGE_LINE = 0x100,
    M_MESSAGE_LINKEDLN = 0x200,
    M_MESSAGE_INSTAGRAM = 0x400,
    M_MESSAGE_TIM = 0x800,
    M_MESSAGE_SNAPCHAT = 0x1000,
    M_MESSAGE_OTHERS = 0x8000,
} m_message_type;


int get_switch_bit_index(attr_id_type_t type);

// 此枚举消息，对应于数组：lit_eventid，主要用于监测苹果手机自己挂电话事件：NOTIFY_EVENT_REMOVED
typedef enum
{
    NOTIFY_EVENT_ADDED,
    NOTIFY_EVENT_MODIFIED,
    NOTIFY_EVENT_REMOVED,
    NOTIFY_EVENT_NULL
} m_ancs_notify_event_t;

// 该结构体变量，用于对ANCS相关的一些处理进行控制
typedef struct
{
    // 20161014 10:22
    uint8_t iosLastVersion;    // 记录上一次跟手环配对的iOS版本信息
    uint8_t iosCurrentVersion; // 记录当前跟手环配对的iOS版本信息
} m_ancs_ctrl_t;

// iOS手机ANCS消息推送结构体
typedef struct
{
    m_ancs_app_attr_info_t ancs_msg;
    attr_id_type_t ancs_msgType; // 总共有4种消息类型：来电、短信、微信、QQ
} ancs_message_package_t;

extern ancs_message_package_t ancs_message_package;

void m_ancs_notif_haldle(ble_ancs_c_evt_notif_t *p_notif, ble_ancs_c_t *ancs_handle);
void m_ancs_notif_attr_handle(ble_ancs_c_evt_notif_attr_t *p_attr);
void m_ancs_new_msg_timer_olde_clear(void);
void m_ancs_app_init(void);

bool m_ancs_msg_short_press_btn_handle(void);
bool m_ancs_call_long_press_btn_handle(void);
void m_ancs_call_clear_handle(void);
void m_ancs_cancel_handle(void);

// 安卓消息处理
bool m_message_enable_check(attr_id_type_t msg_id_type);

void ancs_msg_received(ancs_message_package_t *p_msg);
bool ancs_msg_get(ancs_message_package_t *p_msg, uint8_t index);
uint8_t ancs_msg_get_count(void);
attr_id_type_t ancs_msg_get_type(uint8_t index);
#endif
